<?php
if(!defined('BASE_DIR'))die('Cannot access the file !');
/**
 * -+---------------------------------------------
 * |PHP Framework
 * |Copyright (c) 2010  iblue.cc
 * |E-mail:mejinke@gmail.com
 * |Date 2010-03-22
 * |Update 2010-07-20
 * -+---------------------------------------------
 */

/**
 * 注册类自动加载方式
 */
function __autoload($classname){
	Base::autoLoadClass($classname);
}

/**
  * 快速实例化 controller
  * @param string	$classname	控制器名称
  */
function C($classname)
{

	Functions::REG('FW_Hook')->run('controller_start');
	//具体控制器的hook
	Functions::REG('FW_Hook')->run(APP_NAME.'_'.Functions::REG('FW_Hook')->getController());
	//应用程序tag hook
	Functions::REG('FW_Hook')->runTag(Application::$app_tag);
	
	//实例化控制器
	if($o =  _Class($classname,false,'controllers'))
	{
		Functions::RES('new_controller'.$classname,$o);
		Functions::REG('FW_Hook')->run('controller_end');
		return $o;
	}

}

/**
 * 实例化一个类对象
 * @param String $class 文件名称
 * @param Boolean $sysClass  是否为系统类
 * @param String $dir   目录名称
 * @param Boolean $error 是否打印出错信息
 */
function _Class($class,$sysClass=true,$dir='',$error=true,$args=null)
{

	//如果是系统类
	if($sysClass)
	{
		$file = FRAMEWORK_LIB_DIR.$class.'.class.php';
		$_class = ucfirst($class);
	}
	//检测是否为用户自定义扩展类
	elseif($dir == 'extend')
		$file = EXTEND_LIB_DIR.$class.'.php';
	//检测是否为model或controller
	else
	{
		if($dir == 'controllers')
		{	
			$import_path = '';
			$tep = explode('.', $class);
			if (count($tep)>1){
				for ($i=0;$i<count($tep)-1;$i++){
					$import_path.=$tep[$i].'/';
				}
				$class = $tep[count($tep)-1];
			}else
				$class = $tep[0];
			
			$_class = ucfirst($class).'Controller';
			$file = APP_DIR.$dir.'/'.$import_path.ucfirst($class).'Controller.class.php';
		}
		else
			return false;
	}

	$file = str_replace('//','/',$file);
	//检查文件是否存在
	if(is_file($file))
		require_once $file;
	
	//检查指定类是否存在
	if(class_exists($_class))
	{
		if ($dir == 'controllers')
			Debug::initClass('<b>'.$_class.' Controller</b>');
		else
			Debug::initClass('<b>'.$_class.' Model</b>');
		return new $_class($args);
	}

	return false;

}



//定义json类
if(!function_exists('json_encode'))
{
	require_once EXTEND_LIB_DIR.'json.php';
	function json_encode($value)
	{
		$json = new Services_JSON();
		return $json->encode($value);
	}
	function json_decode($value)
	{
		$json = new Services_JSON();
		return $json->decode($value);
	}
}



/**
 * 自动生成URL
 * @param Array $array  主要的数组  array('m'=>'module', 'c'=>'controller','a'=>'action');
 * @param Array $args   参数数组     array('id'=>10,'page'=2);
 * @param string $type  生成方式 add:在已在的参数上添加新的参数
 * @param	string	$url	开始位置的URL
 */
function url($array = array(), Array $args = array(), $type=null, $url=null)
{

	if($type=='add')
		$args=Functions::REG('FW_Hook')->addArgs($args);
	$index = '';
	$url= getMainUrl($array,$url).getArgsUrl($args);
	return $url;
}

/**
  * 生成主要的URL 
  * @param String $str 连接定界符
  */
function getMainUrl($_array = array(), $url=null)
{
	if($url!='')
		return $url;
	$router = Functions::REG('FW_Router');
	$array = array();
	!is_array($_array) ? $array['a']= $_array : $array = $_array;
	isset($array['a']) ? $action = $array['a'] : $action = $router->getActionName() ;
	return CE.'/'.$action;
}


/**
 * 生成参数连接串 针对 原始URL模式路由有效
 * @param array $args 参数列表
 * @param bool $old 古老的参数方式 a=1&t=c
 */
function getArgsUrl(Array $args, $old = false)
{

	if(empty($args))
		return '';

	$url= '';
	$tep_array =array();
	$keys_array = array_keys($args);
	for($i=0;$i<count($keys_array);$i++)
	{
		if ($old===true)
		{
			if ($i==0)
				$url .=$keys_array[$i].'='.$args[$keys_array[$i]];
			else 
				$url .='&'.$keys_array[$i].'='.$args[$keys_array[$i]];
		}
		else
		{
			$temp = str_replace('=',urlencode('='),$args[$keys_array[$i]]);
			$temp = str_replace('#',urlencode('#'),$temp);
			$args[$keys_array[$i]] = $temp;
			if(isset($args[$keys_array[$i]]))
				$url .='/'.$keys_array[$i].'='.$args[$keys_array[$i]];
		}
	}
	return $url;
}

?>
